package ar.uade.fain.ai.tpo.controller;

import java.util.ArrayList;
import java.util.List;

import ar.uade.fain.ai.tpo.dao.CategoriaDAO;
import ar.uade.fain.ai.tpo.dao.ComidaDAO;
import ar.uade.fain.ai.tpo.dao.RecetaDAO;
import ar.uade.fain.ai.tpo.dto.CaracteristicaDTO;
import ar.uade.fain.ai.tpo.dto.ComidaDTO;
import ar.uade.fain.ai.tpo.dto.IngredienteDTO;
import ar.uade.fain.ai.tpo.dto.RecetaDTO;
import ar.uade.fain.ai.tpo.model.Caracteristica;
import ar.uade.fain.ai.tpo.model.Categoria;
import ar.uade.fain.ai.tpo.model.Comida;
import ar.uade.fain.ai.tpo.model.Ingrediente;
import ar.uade.fain.ai.tpo.model.Producto;
import ar.uade.fain.ai.tpo.model.Receta;
import ar.uade.fain.ai.tpo.model.RecetaCompuesta;
import ar.uade.fain.ai.tpo.model.RecetaSimple;
import ar.uade.fain.ai.tpo.model.Seccion;

public class AdministracionComidaControlador implements Controlador {

	private RecetaDAO recetaDAO;
	private ComidaDAO comidaDAO;

	public AdministracionComidaControlador() {
		super();
	}

	public ComidaDAO getComidaDAO() {
		return comidaDAO;
	}

	public void setComidaDAO(ComidaDAO comidaDAO) {
		this.comidaDAO = comidaDAO;
	}

	public RecetaDAO getRecetaDAO() {
		return recetaDAO;
	}

	public void setRecetaDAO(RecetaDAO recetaDAO) {
		this.recetaDAO = recetaDAO;
	}

	@Override
	public void init() {
	}

	@Override
	public void destroy() {
	}

	public void altaReceta(RecetaDTO recetaDTO) {
		if (getRecetaDAO().buscarPorId(recetaDTO.getId()) == null) {
			if (recetaDTO.esRecetaCompuesta()) {
				RecetaCompuesta receta = new RecetaCompuesta(
						recetaDTO.getNombre(), recetaDTO.getId());
				Caracteristica caracteristica = armarCaracteristica(recetaDTO
						.getCaracteristicaDTO());
				receta.setCaracteristica(caracteristica);
				receta.setIngredientes(map(receta, recetaDTO.getIngredientes()));
				receta.setRecetas(this.BuscarListaRecetas(recetaDTO
						.getRecetasContenidas()));
				getRecetaDAO().guardar(receta);

			} else {

				RecetaSimple receta = new RecetaSimple(recetaDTO.getNombre(),
						recetaDTO.getId());
				Caracteristica caracteristica = armarCaracteristica(recetaDTO
						.getCaracteristicaDTO());
				receta.setCaracteristica(caracteristica);
				receta.setIngredientes(map(receta, recetaDTO.getIngredientes()));
				getRecetaDAO().guardar(receta);

			}
		}
	}

	private List<Ingrediente> map(Receta receta, List<IngredienteDTO> dtos) {
		ArrayList<Ingrediente> ingredientes = new ArrayList<Ingrediente>();
		for (IngredienteDTO dto : dtos) {
			final Ingrediente ingrediente = new Ingrediente();
			Producto producto = new Producto();
			producto.setId(dto.getProductoDTO().getId());
			ingrediente.setProducto(producto);
			ingrediente.setCantidad(dto.getCantidad());
			ingrediente.setReceta(receta);
			ingredientes.add(ingrediente);
		}
		return ingredientes;
	}

	public void altaComida(final ComidaDTO comidaDTO) {
		if (comidaDTO.getId() == null
				|| getComidaDAO().getByID(comidaDTO.getId()) == null) {
			final Comida comida = map(comidaDTO);
			getComidaDAO().guardar(comida);
		}
	}

	private Comida map(final ComidaDTO dto) {
		final Comida comida = new Comida();
		comida.setId(dto.getId());
		comida.setNombre(dto.getNombre());
		final Seccion seccion = new Seccion(dto.getIdSeccion(), null);
		comida.setSeccion(seccion);
		final Receta receta = getRecetaDAO().buscarPorId(dto.getIdReceta());
		comida.setReceta(receta);
		final Categoria categoria = new Categoria(null, dto.getIdCategoria());
		comida.setCategoria(categoria);
		return comida;
	}

	private Caracteristica armarCaracteristica(
			CaracteristicaDTO caracteristicaDTO) {
		Caracteristica caracteristica = new Caracteristica();
		caracteristica.setAlHorno(caracteristicaDTO.isAlHorno());
		caracteristica.setComplejidad(caracteristicaDTO.getComplejidad());
		caracteristica.setDescripcion(caracteristicaDTO.getDescripcion());
		caracteristica.setId(caracteristicaDTO.getId());
		caracteristica.setTiempoCoccion(caracteristicaDTO.getTiempoCoccion());
		CategoriaDAO cDAO = new CategoriaDAO();
		Long id = (long)(caracteristicaDTO.getCategoria());
		Categoria categoria = cDAO.buscarPorId(id);
		caracteristica.setCategoria(categoria);
		
		return caracteristica;
	}
	public void eliminarComida(final Long id) {
		if (id != null) {
			getComidaDAO().eliminar(id);
		}
	}

	public void eliminarReceta(final Long id) {
		if (id != null) {
			getRecetaDAO().eliminarReceta(id);
		}
	}

	private List<Receta> BuscarListaRecetas(List<Long> IdsRecetas) {
		List<Receta> recetas = new ArrayList<Receta>();

		for (int i = IdsRecetas.size(); i >= 0; i--) {

			recetas.add(getRecetaDAO().buscarPorId(IdsRecetas.get(i)));

		}

		return recetas;
	}
	
	public boolean existeReceta(Long id){
		return getRecetaDAO().buscarPorId(id) != null;
	}

}
